Subroutine to calculate the distance between the units inside a kohonen layer
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=wp), | intent(inout), | dimension(:,:) | :: | coordinates |
A real array |
|
real(kind=wp), | intent(inout), | dimension(:,:) | :: | distance_matrix |
A real array |
|
character(len=*) | :: | grid_type |
A character varaible |
|||
logical | :: | toroidal |
A logical variableS |
Type | Visibility | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|---|
integer, | public | :: | i | ||||
integer, | public | :: | j | ||||
real(kind=wp), | public | :: | maxdiffx | ||||
real(kind=wp), | public | :: | maxdiffy | ||||
real(kind=wp), | public | :: | maxdiffz | ||||
real(kind=wp), | public, | dimension(3) | :: | diffs |
subroutine calculate_distance_matrix(coordinates,distance_matrix,grid_type,toroidal) !======================================================================================== !! Subroutine to calculate the distance between the units inside a kohonen layer real(kind=wp),dimension(:,:),intent(inout) :: coordinates !! A real array real(kind=wp),dimension(:,:),intent(inout) :: distance_matrix !! A real array character(len=*) :: grid_type !! A character varaible logical :: toroidal !! A logical variableS integer :: i,j real(kind=wp) :: maxdiffx,maxdiffy,maxdiffz real(kind=wp),dimension(3) :: diffs ! maxdiffx=maxval(coordinates(:,1))/2.0_wp; maxdiffy=maxval(coordinates(:,2))/2.0_wp; maxdiffz=maxval(coordinates(:,3))/2.0_wp; ! if(toroidal) then do i=1,size(distance_matrix,1) do j=i+1,size(distance_matrix,2) diffs=abs(coordinates(j,1:3) - coordinates(i,1:3)); if (diffs(1) > maxdiffx) diffs(1)=2.0_wp*maxdiffx - diffs(1); if (diffs(2) > maxdiffy) diffs(2)=2.0_wp*maxdiffy - diffs(2); !if (diffs(3) > maxdiffy) diffs(3)=2*maxdiffz - diffs(3); if (trim(grid_type) .eq. "hexagonal") then distance_matrix(i,j)= sum(diffs**2); elseif(trim(grid_type) .eq. "rectangular") then !rectangular distance_matrix(i,j)=maxval(diffs); endif enddo enddo else do i=1,size(distance_matrix,1) do j=i+1,size(distance_matrix,2) diffs=abs(coordinates(j,1:3) - coordinates(i,1:3)); distance_matrix(i,j)=dsqrt(sum(diffs**2)); enddo enddo endif ! distance_matrix=distance_matrix + transpose(distance_matrix); !write(*,'(49f10.4)') distance_matrix(1,:) ! end subroutine calculate_distance_matrix